#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
#include<iostream>

// const char* myfile = "/home/zzy/code/9.19/test/mycmd";
const char* myfile = "mycmd";
#define NUM 16

int main()
{

  // execle 
  char* _env[NUM] = {
    (char*)"MY_ZZY_VAL=667788",
    NULL 
  };
  pid_t id = fork();
  if(!id)
  {
    // 子进程
    printf("子进程开始执行,pid: %d\n",getpid());
    sleep(1);

    execle(myfile, "mycmd", "-a", NULL, _env);

    // execlp("./test.py", "test.py", NULL);
    // execlp("python", "python", "test.py", NULL); 
    // execl(myfile, "mycmd", "-b", NULL);

    // char *const _argv[NUM] = { (char*)"ls", (char*)"-a", (char*)"-l", NULL };
    // execv("/usr/bin/ls", _argv);
  
    // execlp("ls", "ls", "-a", "-l", NULL);

    // char *const _argv[NUM] = { (char*)"ls", (char*)"-a", (char*)"-l", NULL };
    // execvp("ls", _argv);

    // char *const _argv[NUM] = { (char*)"ls", (char*)"-a", (char*)"-l", NULL };



    exit(1);
  }
  else 
  {
    printf("父进程开始执行,pid: %d\n",getpid());
    int status = 0;
    pid_t id = waitpid(-1, &status, 0);
    if(id > 0)
    {
      printf("wait success,wait code: %d\n", WEXITSTATUS(status));
    }
  }

  return 0;
}













// int main()
// {
//   printf("process start\n");
// 
//   // execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
//   //  execl("/usr/bin/top", "top", NULL);
// 
//   execl("/usr/bin/ls", "ls", "--color=auto", "-a", "-l", NULL);
//   printf("process end\n");
// }







// typedef void (*handler)();
// 
// std::vector<handler> handers;// 函数指针数组
// 
// void func1()
// {
//   printf("临时任务1\n");
// }
// void func2()
// {
//   printf("临时任务2\n");
// }
// 
// void Load()
// {
//   // 父进程闲的时候加载函数，可以干其他事
//   handers.push_back(func1);
//   handers.push_back(func2);
// }
// 
// int main()
// {
//   pid_t id = fork();
//   if(!id)
//   {
//     int c = 5;
//     while(c)
//     {
//       printf("子进程：%d\n",c--);
//       sleep(1);
//     }
//     exit(11);// 测试
//   }
//   else 
//   {
//     int quit = 0;
//     while(!quit)
//     {
//       int status = 0;
//       pid_t res = waitpid(-1, &status, WNOHANG);
//       // pid_t res = waitpid(-1, &status, 0);
//       if(res > 0)
//       {
//         // 等待成功 子进程退出
//         printf("等待子进程退出成功，退出码：%d\n", WEXITSTATUS(status));
//         quit = 1;
//       }
//       else if(res == 0)
//       {
//         // 等待成功 子进程未退出
//         printf("子进程还在运行，未退出，父进程干自己想干的事\n");
//         if(handers.empty())
//           Load();
//         for(int i = 0; i < 2; i++)
//         {
//           handers[i]();
//         }
//       }
//       else 
//       {
//         // 等待失败
//         printf("等待失败\n");
//       }
//       sleep(1);
//     }
// 
// 
// 
// 
//    //  int status = 0;
//    //  // 子进程退出时，父进程的waitpid才会进行返回
//    //  // wait/waitpid使进程有一定的顺序性
//    //  // 将来父进程可进行更多的收尾工作
//    //  
//    //  //options参数设置
//    //  pid_t id = waitpid(-1, &status, 0);// options == 0默认是在阻塞状态，等子进程结束
//    //  if(id > 0)
//    //  {
//    //    // printf("父进程等待成功，退出码：%d，退出信号：%d\n", (status >> 8)&0xff, status & 0x7f);
//    //    if(WIFEXITED(status))
//    //    {
//    //      printf("子进程的退出码：%d\n", WEXITSTATUS(status));
//    //    }
//    //    else 
//    //    {
//    //      printf("子进程异常退出：%d\n", WIFEXITED(status));
//    //    }
//    //  }
//   }
// 
//   return 0;
// }
